#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
#!
FME_PYTHON_VERSION 27
GUI IGNORE SourceDataset_NGRID_1,NGRID_IN_SEARCH_ENVELOPE_MINX_NGRID_1,NGRID_IN_SEARCH_ENVELOPE_MINY_NGRID_1,NGRID_IN_SEARCH_ENVELOPE_MAXX_NGRID_1,NGRID_IN_SEARCH_ENVELOPE_MAXY_NGRID_1,NGRID_IN_CLIP_TO_ENVELOPE_NGRID_1,SEARCH_ENVELOPE_COORDINATE_SYSTEM_NGRID_1,DestDataset_TEXTLINE_1,TEXTLINE_OUT_OVERWRITE_FILE_TEXTLINE_1,TEXTLINE_OUT_END_OF_LINE_TEXTLINE_1,TEXTLINE_OUT_WRITE_LAST_EOL_TEXTLINE_1,TEXTLINE_OUT_ENCODING_TEXTLINE_1,TEXTLINE_OUT_WRITE_UTF8_BOM_TEXTLINE_1
DEFAULT_MACRO DestDataset_TEXTLINE $(FME_MF_DIR)GridData\EGM08_REDNAP.grd
GUI FILENAME DestDataset_TEXTLINE Text/Compressed_Text_Files(*.txt;*.txt.gz)|*.txt;*.txt.gz|Text_Files(*.txt)|*.txt|Compressed_Text_Files(*.txt.gz)|*.txt.gz|All_files(*.*)|*.* Destination Text File:
INCLUDE [ if {{$(DestDataset_TEXTLINE)} == {}} { puts_real {Parameter 'DestDataset_TEXTLINE' must be given a value.}; exit 1; }; ]
#! START_HEADER
#! START_WB_HEADER
READER_TYPE NGRID
READER_KEYWORD NGRID_1
READER_GEN_DIRECTIVES GROUP_BY_DATASET,No,SEARCH_ENVELOPE_MINX,0,SEARCH_ENVELOPE_MINY,0,_MERGE_SCHEMAS,YES,CLIP_TO_ENVELOPE,NO,USE_SEARCH_ENVELOPE,NO,SEARCH_ENVELOPE_MAXX,0,SEARCH_ENVELOPE_MAXY,0,NGRID_EXPOSE_FORMAT_ATTRS,
WRITER_TYPE MULTI_WRITER
MULTI_WRITER_DATASET_ORDER BY_ID
MULTI_WRITER_FIRST_WRITER_ID 0
MULTI_WRITER_TYPE{0} TEXTLINE
MULTI_WRITER_KEYWORD{0} TEXTLINE_1
#! END_WB_HEADER
#! START_WB_HEADER
MACRO WB_KEYWORD "NGRID_1"
#! END_WB_HEADER
#! START_SOURCE_HEADER NGRID NGRID_1
# ============================================================================
# The following GUI line prompts for a directory to be used as the
# source of the NGrid based files.
# The user input is stored in a macro, which is then used to define
# the dataset to be read.
# The dataset this mapping file was generated from was:
#! END_SOURCE_HEADER
#! START_WB_HEADER
DEFAULT_MACRO SourceDataset
INCLUDE [ if {{$(SourceDataset)} != ""} { \
puts {DEFAULT_MACRO SourceDataset_NGRID_1 $(SourceDataset)} \
} ]
#! END_WB_HEADER
#! START_SOURCE_HEADER NGRID NGRID_1
DEFAULT_MACRO SourceDataset_NGRID_1 $(FME_MF_DIR)official\EGM08_REDNAP.grd
GUI MULTIFILE SourceDataset_NGRID_1 Vertical_Mapper_Grid_Files(*.grd;*.grc)|*.grd;*.grc|Vertical_Mapper_Continuous_Grid_Files(*.grd)|*.grd|Vertical_Mapper_Classified_Grid_Files(*.grc)|*.grc|All_Files(*.*)|*.* Source Vertical Mapper Grid (NGrid) File(s):
NGRID_1_READER_META_ATTRIBUTES fme_basename
DEFAULT_MACRO NGRID_IN_GROUP_BY_DATASET_NGRID_1 No
NGRID_1_GROUP_BY_DATASET "$(NGRID_IN_GROUP_BY_DATASET_NGRID_1)"
# Include this file in source setting section to add external search envelope processing
# Zero as a default means we don't do any search -- this makes workbench happier
# ===========================================================================
DEFAULT_MACRO NGRID_IN_SEARCH_ENVELOPE_MINX_NGRID_1 0
NGRID_1_SEARCH_ENVELOPE "$(NGRID_IN_SEARCH_ENVELOPE_MINX_NGRID_1)"
GUI OPTIONAL FLOAT NGRID_IN_SEARCH_ENVELOPE_MINX_NGRID_1 Minimum X:
# ===========================================================================
DEFAULT_MACRO NGRID_IN_SEARCH_ENVELOPE_MINY_NGRID_1 0
NGRID_1_SEARCH_ENVELOPE "$(NGRID_IN_SEARCH_ENVELOPE_MINY_NGRID_1)"
GUI OPTIONAL FLOAT NGRID_IN_SEARCH_ENVELOPE_MINY_NGRID_1 Minimum Y:
# ===========================================================================
DEFAULT_MACRO NGRID_IN_SEARCH_ENVELOPE_MAXX_NGRID_1 0
NGRID_1_SEARCH_ENVELOPE "$(NGRID_IN_SEARCH_ENVELOPE_MAXX_NGRID_1)"
GUI OPTIONAL FLOAT NGRID_IN_SEARCH_ENVELOPE_MAXX_NGRID_1 Maximum X:
# ===========================================================================
DEFAULT_MACRO NGRID_IN_SEARCH_ENVELOPE_MAXY_NGRID_1 0
NGRID_1_SEARCH_ENVELOPE "$(NGRID_IN_SEARCH_ENVELOPE_MAXY_NGRID_1)"
GUI OPTIONAL FLOAT NGRID_IN_SEARCH_ENVELOPE_MAXY_NGRID_1 Maximum Y:
# ===========================================================================
# BUG18999: We now have a soft clip to fall back on like native spatial index
# thus we are reintroducing the clip to envelop as an option for users.
# Defualt to soft clip as per the existing database readers we are emulating
DEFAULT_MACRO NGRID_IN_CLIP_TO_ENVELOPE_NGRID_1 NO
NGRID_1_CLIP_TO_ENVELOPE "$(NGRID_IN_CLIP_TO_ENVELOPE_NGRID_1)"
GUI OPTIONAL CHECKBOX NGRID_IN_CLIP_TO_ENVELOPE_NGRID_1 YES%NO Clip to Search Envelope
# PR:31021
# Include this file in workbench source preamble section to enable the ability
# to specify a coordinate system for search envelope processing
# ===========================================================================
DEFAULT_MACRO SEARCH_ENVELOPE_COORDINATE_SYSTEM_NGRID_1
GUI OPTIONAL COORDSYS SEARCH_ENVELOPE_COORDINATE_SYSTEM_NGRID_1 Search Envelope Coordinate System:
NGRID_1_SEARCH_ENVELOPE_COORDINATE_SYSTEM "$(SEARCH_ENVELOPE_COORDINATE_SYSTEM_NGRID_1)"
# ===========================================================================
NGRID_1_DATASET "$(SourceDataset_NGRID_1)"
#! END_SOURCE_HEADER
#! START_WB_HEADER
MACRO WB_KEYWORD "TEXTLINE_1"
#! END_WB_HEADER
#! START_DEST_HEADER TEXTLINE TEXTLINE_1
# =====================================================================
# The following GUI line prompts for a directory to be used as the
# the destination for the TextLine files. The user input is stored in
# a macro, which is then used to define the dataset to be written.
#! END_DEST_HEADER
#! START_WB_HEADER
DEFAULT_MACRO DestDataset
INCLUDE [ if {"$(DestDataset)" != ""} { \
puts {DEFAULT_MACRO DestDataset_TEXTLINE_1 $(DestDataset)} \
} ]
#! END_WB_HEADER
#! START_DEST_HEADER TEXTLINE TEXTLINE_1
DEFAULT_MACRO DestDataset_TEXTLINE_1 $(DestDataset_TEXTLINE)
GUI FILENAME DestDataset_TEXTLINE_1 Text/Compressed_Text_Files(*.txt;*.txt.gz)|*.txt;*.txt.gz|Text_Files(*.txt)|*.txt|Compressed_Text_Files(*.txt.gz)|*.txt.gz|All_files(*.*)|*.* Destination Text File:
# =====================================================================
# The following GUI line prompts for the overwrite flag. The default is
# YES. Possible values are YES or NO. Any value other than NO or
# no is interpreted as YES.
DEFAULT_MACRO TEXTLINE_OUT_OVERWRITE_FILE_TEXTLINE_1 YES
TEXTLINE_1_OVERWRITE_FILE "$(TEXTLINE_OUT_OVERWRITE_FILE_TEXTLINE_1)"
GUI CHOICE TEXTLINE_OUT_OVERWRITE_FILE_TEXTLINE_1 YES%NO Overwrite Existing File:
# =====================================================================
# Set the type of encoding for the output file
# =====================================================================
# Set line termination character
DEFAULT_MACRO TEXTLINE_OUT_END_OF_LINE_TEXTLINE_1 System
TEXTLINE_1_END_OF_LINE "$(TEXTLINE_OUT_END_OF_LINE_TEXTLINE_1)"
GUI CHOICE TEXTLINE_OUT_END_OF_LINE_TEXTLINE_1 System%Windows%Unix%Macintosh%Source%None Line Termination:
# =====================================================================
# Set whether to write the last line termination character
DEFAULT_MACRO TEXTLINE_OUT_WRITE_LAST_EOL_TEXTLINE_1 YES
TEXTLINE_1_WRITE_LAST_EOL "$(TEXTLINE_OUT_WRITE_LAST_EOL_TEXTLINE_1)"
GUI CHOICE TEXTLINE_OUT_WRITE_LAST_EOL_TEXTLINE_1 YES%NO Write Last Line Terminator:
DEFAULT_MACRO TEXTLINE_OUT_ENCODING_TEXTLINE_1 ANSI
TEXTLINE_1_ENCODING "$(TEXTLINE_OUT_ENCODING_TEXTLINE_1)"
GUI STRING_OR_ENCODING TEXTLINE_OUT_ENCODING_TEXTLINE_1 UTF-8%UTF-16LE%UTF-16BE%ANSI%BIG5%SJIS%CP037%CP437%CP708%CP720%CP737%CP775%CP850%CP852%CP855%CP857%CP860%CP861%CP862%CP863%CP864%CP865%CP866%CP869%CP932%CP936%CP950%CP1250%CP1251%CP1252%CP1253%CP1254%CP1255%CP1256%CP1257%CP1258%ISO8859-1%ISO8859-2%ISO8859-3%ISO8859-4%ISO8859-5%ISO8859-6%ISO8859-7%ISO8859-8%ISO8859-9%ISO8859-13%ISO8859-15 Character Encoding:
# =====================================================================
# The following GUI line prompts for the overwrite flag. The default is
# YES. Possible values are YES or NO. Any value other than NO or
# no is interpreted as YES.
DEFAULT_MACRO TEXTLINE_OUT_WRITE_UTF8_BOM_TEXTLINE_1 YES
TEXTLINE_1_WRITE_UTF8_BOM "$(TEXTLINE_OUT_WRITE_UTF8_BOM_TEXTLINE_1)"
GUI CHOICE TEXTLINE_OUT_WRITE_UTF8_BOM_TEXTLINE_1 YES%NO Write UTF Byte Order Mark
# =====================================================================
# Set the mime type. Note -- it is actually only used inside of workspaces
# as a FORMAT_PARAMETER which even then is parsed only by the FME Server
# Repository Manager
TEXTLINE_1_DATASET "$(DestDataset_TEXTLINE_1)"
#! END_DEST_HEADER
#! START_WB_HEADER
#! END_WB_HEADER
#! END_HEADER
LOG_FILENAME "$(FME_MF_DIR)Convert_GRD_from Ngrid.log"
LOG_APPEND NO
LOG_MAX_FEATURES 200
LOG_MAX_RECORDED_FEATURES 200
FME_REPROJECTION_ENGINE FME
FME_IMPLICIT_CSMAP_REPROJECTION_MODE Auto
FME_GEOMETRY_HANDLING Enhanced
FME_STROKE_MAX_DEVIATION 0
LOG_FILTER_MASK -1
DEFAULT_MACRO DATASET_KEYWORD_NGRID_1 NGRID_1
DEFAULT_MACRO DATASET_KEYWORD_TEXTLINE_1 TEXTLINE_1
# -------------------------------------------------------------------------
NGRID_1_READER_META_ATTRIBUTES fme_basename fme_feature_type
# -------------------------------------------------------------------------
MULTI_READER_CONTINUE_ON_READER_FAILURE No
# -------------------------------------------------------------------------
MACRO WORKSPACE_NAME Convert_GRD_from Ngrid
MACRO FME_VIEWER_APP fmedatainspector
# -------------------------------------------------------------------------
NGRID_1_DEF NGRID
# -------------------------------------------------------------------------
FACTORY_DEF * RoutingFactory FACTORY_NAME "Router and Unexpected Input Remover" COMMAND_PARM_EVALUATION SINGLE_PASS MULTI_READER_KEYWORD NGRID_1 INPUT FEATURE_TYPE * ROUTE NGRID NGRID_1::NGRID TO FME_GENERIC ::NGRID ALIAS_GEOMETRY MERGE_INPUT Yes OUTPUT ROUTED FEATURE_TYPE *
NGRID_1_MERGE_DEF NGRID_1::NGRID EXACT NGRID
# -------------------------------------------------------------------------
FACTORY_DEF * TeeFactory FACTORY_NAME "NGRID (NGRID_1) Splitter" INPUT FEATURE_TYPE NGRID OUTPUT FEATURE_TYPE NGRID_NGRID_1
DEFAULT_MACRO WB_CURRENT_CONTEXT
# -------------------------------------------------------------------------
FACTORY_DEF * TeeFactory FACTORY_NAME RasterPropertiesExtractor INPUT FEATURE_TYPE NGRID_NGRID_1 OUTPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT @RasterProperties(RASTER_ROTATION2D)
FACTORY_DEF * TeeFactory FACTORY_NAME "RasterPropertiesExtractor OUTPUT Splitter" INPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT OUTPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT_0_G3rbAaamObs= OUTPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT_1_V9DxUvSwvxY= OUTPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT_2_kVQsfPJRS1U=
# -------------------------------------------------------------------------
FACTORY_DEF * RasterToVectorFactory FACTORY_NAME RasterCellCoercer INPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT_2_kVQsfPJRS1U= PRESERVE_ATTRIBUTES NO COLUMN_ATTRIBUTE _column ROW_ATTRIBUTE _row EXTRACT_NODATA Yes CELL_GEOMETRY Points EXTRACT_VALUES_AS_ATTRIBUTES Yes OUTPUT POINTS FEATURE_TYPE RasterCellCoercer_OUTPUT
# -------------------------------------------------------------------------
FACTORY_DEF * TestFactory FACTORY_NAME Tester INPUT FEATURE_TYPE RasterCellCoercer_OUTPUT TEST @EvaluateExpression(STRING_ENCODED,Value_band0.value,Tester) < 10000000 ENCODED BOOLEAN_OPERATOR OR OUTPUT PASSED FEATURE_TYPE Tester_PASSED OUTPUT FAILED FEATURE_TYPE Tester_FAILED
# -------------------------------------------------------------------------
FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator_4 INPUT FEATURE_TYPE Tester_FAILED ATTR value 0 OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_4_OUTPUT
# -------------------------------------------------------------------------
FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator_3 INPUT FEATURE_TYPE Tester_PASSED ATTR value Value_band0.value OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_3_OUTPUT
# -------------------------------------------------------------------------
Tcl2 regsub {^[^a-zA-Z]*([a-zA-Z]).*} {3.3f} {\1} formatChar; if { [string first $formatChar {duiofxeEgG}] != -1 } { proc {StringFormatter_3_getAttribute} {attr} { return [regsub {^(-?)0*(.)} [FME_GetAttribute $attr] {\1\2}] } } else { proc {StringFormatter_3_getAttribute} {attr} { return [FME_GetAttribute $attr] } }
Tcl2 proc StringFormatter_3_formatter {} { set attrs [split {value} {,}]; foreach attr $attrs { set attrVal [FME_GetAttribute $attr]; set length [string length $attrVal]; if {$length > 0} { FME_SetAttribute $attr [format %3.3f [{StringFormatter_3_getAttribute} $attr]]; }; }; }
FACTORY_DEF * TeeFactory FACTORY_NAME StringFormatter_3 INPUT FEATURE_TYPE AttributeCreator_3_OUTPUT INPUT FEATURE_TYPE AttributeCreator_4_OUTPUT OUTPUT FEATURE_TYPE StringFormatter_3_OUTPUT @Tcl2(StringFormatter_3_formatter)
# -------------------------------------------------------------------------
Tcl2 regsub {^[^a-zA-Z]*([a-zA-Z]).*} {9s} {\1} formatChar; if { [string first $formatChar {duiofxeEgG}] != -1 } { proc {StringFormatter_4_getAttribute} {attr} { return [regsub {^(-?)0*(.)} [FME_GetAttribute $attr] {\1\2}] } } else { proc {StringFormatter_4_getAttribute} {attr} { return [FME_GetAttribute $attr] } }
Tcl2 proc StringFormatter_4_formatter {} { set attrs [split {value} {,}]; foreach attr $attrs { set attrVal [FME_GetAttribute $attr]; set length [string length $attrVal]; if {$length > 0} { FME_SetAttribute $attr [format %9s [{StringFormatter_4_getAttribute} $attr]]; }; }; }
FACTORY_DEF * TeeFactory FACTORY_NAME StringFormatter_4 INPUT FEATURE_TYPE StringFormatter_3_OUTPUT OUTPUT FEATURE_TYPE StringFormatter_4_OUTPUT @Tcl2(StringFormatter_4_formatter)
# -------------------------------------------------------------------------
FACTORY_DEF * SortFactory FACTORY_NAME Sorter_2 INPUT FEATURE_TYPE StringFormatter_4_OUTPUT SORT_BY _row NUMERIC ASCENDING _column NUMERIC ASCENDING OUTPUT SORTED FEATURE_TYPE Sorter_2_SORTED
# -------------------------------------------------------------------------
# Create the DomainName that this transformer will use.
# Because @Count itself will evalute the expression to calculate the
# domain, we don't need to do anything in Tcl per feature going by
INCLUDE [ set domainPrefix {}; if { {Global} == {Local} } { set domainPrefix [FME_EncodeText {Counter_}]; }; puts "MACRO Counter_FULL_DOMAIN ${domainPrefix}counter"; ]
FACTORY_DEF * TeeFactory FACTORY_NAME Counter_Counter INPUT FEATURE_TYPE Sorter_2_SORTED @RenameAttributes(FME_STRICT,___fme_rejection_code___,fme_rejection_code) OUTPUT FEATURE_TYPE ___TOREJECTOR___ "_count" @Count(REJECTABLE,fme_encoded,$(Counter_FULL_DOMAIN),"0")
FACTORY_DEF * TestFactory FACTORY_NAME Counter_Rejector INPUT FEATURE_TYPE ___TOREJECTOR___ TEST @Value(fme_rejection_code) != "" OUTPUT PASSED FEATURE_TYPE Counter_ @RemoveAttributes(___fme_rejection_code___) OUTPUT FAILED FEATURE_TYPE Counter_OUTPUT @RenameAttributes(FME_STRICT,fme_rejection_code,___fme_rejection_code___)
FACTORY_DEF * TeeFactory FACTORY_NAME "Counter Output Nuker" INPUT FEATURE_TYPE Counter_
# -------------------------------------------------------------------------
FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator_6 INPUT FEATURE_TYPE Counter_OUTPUT ATTR _mod_count EvaluateValue_count8 OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_6_OUTPUT
# -------------------------------------------------------------------------
DEFAULT_MACRO Aggregator_BREAK_ATTR
INCLUDE [if {"No" == "Yes"} {puts {MACRO Aggregator_BREAK_ATTR BREAK_BEFORE_FIELD_CHANGE _mod_count} }]
FACTORY_DEF * AggregateFactory FACTORY_NAME Aggregator INPUT FEATURE_TYPE AttributeCreator_6_OUTPUT MODE ONE_LEVEL GROUP_BY _mod_count $(Aggregator_BREAK_ATTR) ACCUMULATE_ATTRIBUTES Never LIST_NAME "_list{}" SEPARATOR PRODUCE_MULTIS YES OUTPUT AGGREGATE FEATURE_TYPE Aggregator_AGGREGATE @Geometry(SET_TO_CONTAIN_INDIVIDUAL_GEOMS, NO)
# -------------------------------------------------------------------------
Tcl2 set ListSorterRenamedAttrPrefix ________
Tcl2 proc ListSorter_sort {} { global ListSorterRenamedAttrPrefix; regsub \"{}.*$\" {_list{}._count} \"\{\" listBase; regsub \"{}.*$\" {_list{}._count} \"\" listName; set listBaseLen [string length $listBase]; set listNameLen [expr $listBaseLen - 1]; set listValueExtension [string replace {_list{}._count} 0 $listBaseLen {}]; set COMMENT { = For each attribute "listattr{}.count" and all related attributes = "listattr{}", create a list of the form = {$listattr{}.count } = and append the list to toSort, and keep a list of the extensions = for each index in the associative array listExtensions(). = While iterating over the attributes, rename all such attributes to = "________listattr{}" to = keep them out of the way, and to make them easier to clean up later. = = Note that we're manually pulling out the index and extension, instead = of using regular expressions, as it is much more efficient }; set toSort {}; foreach attr [FME_AttributeNames] { set attrStart [string range $attr 0 $listNameLen]; if { $attrStart == $listBase } { set braceEnd [string first \} $attr $listBaseLen]; set index [string range $attr $listBaseLen [expr $braceEnd - 1]]; set extension [string range $attr [expr $braceEnd + 1] end]; lappend listExtensions($index) $extension; if { $extension == $listValueExtension } { lappend toSort [list [FME_GetAttribute $attr] $index] }; FME_RenameAttribute "$ListSorterRenamedAttrPrefix$attr" $attr; set renamedAttrs($ListSorterRenamedAttrPrefix$attr) 1; } }; set COMMENT { = Sort the {$listattr{} } by index 0 (attr value) }; set sortedList [lsort -real -index 0 $toSort]; set destIndex 0; set COMMENT { = For each list within sortedList, iterate over the list, renaming = "________listattr{}" to = "listattr{}" }; foreach pair $sortedList { set elementNum [lindex $pair 1]; set newAttrBase "$listName\{$destIndex\}"; set oldAttrBase "$listName\{$elementNum\}"; foreach extension $listExtensions($elementNum) { FME_RenameAttribute "$newAttrBase$extension" "$ListSorterRenamedAttrPrefix$oldAttrBase$extension"; unset renamedAttrs($ListSorterRenamedAttrPrefix$oldAttrBase$extension); }; incr destIndex }; set COMMENT { = If any attributes were renamed to their temporary names above, and they = did not contain the structure extension on which we were sorting, they = will still exist on the feature, and must be cleaned up. }; foreach remainingAttr [array names renamedAttrs] { FME_UnsetAttributes $remainingAttr }; }
FACTORY_DEF * TeeFactory FACTORY_NAME ListSorter INPUT FEATURE_TYPE Aggregator_AGGREGATE OUTPUT FEATURE_TYPE ListSorter_OUTPUT @Tcl2("ListSorter_sort")
# -------------------------------------------------------------------------
Tcl2 set ListConcatenator__separator [FME_DecodeText {}]; regsub -all \"{}\" {_list{}.value} \"{*}\" ListConcatenator__listPattern;
Tcl2 proc ListConcatenator__Concatenate {} { upvar \#0 ListConcatenator__separator separator ListConcatenator__listPattern listPattern; set allAttrs [lsort -dictionary [FME_AttributeNames]]; set keepEmptyParts [string equal {No} {No}]; set result {}; foreach attrName $allAttrs { if {[string match $listPattern $attrName]} { set attrValue [FME_GetAttribute $attrName]; if {$keepEmptyParts || $attrValue != {}} { lappend result $attrValue; }; }; }; FME_SetAttribute {"_concatenated"} [join $result $separator]; }
FACTORY_DEF * TeeFactory FACTORY_NAME ListConcatenator INPUT FEATURE_TYPE ListSorter_OUTPUT OUTPUT FEATURE_TYPE ListConcatenator_OUTPUT @Tcl2(ListConcatenator__Concatenate)
# -------------------------------------------------------------------------
FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator_5 INPUT FEATURE_TYPE ListConcatenator_OUTPUT ATTR text_line_data Value_concatenated ATTR _sort EvaluateValue_mod_count+5 OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_5_OUTPUT
# -------------------------------------------------------------------------
FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator_2 INPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT_0_G3rbAaamObs= ATTR _sort 1 ATTR text_line_data "" OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_2_OUTPUT
# -------------------------------------------------------------------------
FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator_7 INPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT_1_V9DxUvSwvxY= ATTR _min_x EvaluateValue_min_x+Value_spacing_x*0.5 ATTR _min_y EvaluateValue_min_y+Value_spacing_y*0.5 ATTR _max_x EvaluateValue_max_x-Value_spacing_x*0.5 ATTR _max_y EvaluateValue_max_y-Value_spacing_y*0.5 OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_7_OUTPUT
# -------------------------------------------------------------------------
Tcl2 regsub {^[^a-zA-Z]*([a-zA-Z]).*} {05.8f} {\1} formatChar; if { [string first $formatChar {duiofxeEgG}] != -1 } { proc {StringFormatter_getAttribute} {attr} { return [regsub {^(-?)0*(.)} [FME_GetAttribute $attr] {\1\2}] } } else { proc {StringFormatter_getAttribute} {attr} { return [FME_GetAttribute $attr] } }
Tcl2 proc StringFormatter_formatter {} { set attrs [split {_spacing_x,_spacing_y,_min_x,_min_y,_max_x,_max_y} {,}]; foreach attr $attrs { set attrVal [FME_GetAttribute $attr]; set length [string length $attrVal]; if {$length > 0} { FME_SetAttribute $attr [format %05.8f [{StringFormatter_getAttribute} $attr]]; }; }; }
FACTORY_DEF * TeeFactory FACTORY_NAME StringFormatter INPUT FEATURE_TYPE AttributeCreator_7_OUTPUT OUTPUT FEATURE_TYPE StringFormatter_OUTPUT @Tcl2(StringFormatter_formatter)
# -------------------------------------------------------------------------
Tcl2 regsub {^[^a-zA-Z]*([a-zA-Z]).*} {12s} {\1} formatChar; if { [string first $formatChar {duiofxeEgG}] != -1 } { proc {StringFormatter_2_getAttribute} {attr} { return [regsub {^(-?)0*(.)} [FME_GetAttribute $attr] {\1\2}] } } else { proc {StringFormatter_2_getAttribute} {attr} { return [FME_GetAttribute $attr] } }
Tcl2 proc StringFormatter_2_formatter {} { set attrs [split {_spacing_x,_spacing_y,_min_x,_min_y,_max_x,_max_y} {,}]; foreach attr $attrs { set attrVal [FME_GetAttribute $attr]; set length [string length $attrVal]; if {$length > 0} { FME_SetAttribute $attr [format %12s [{StringFormatter_2_getAttribute} $attr]]; }; }; }
FACTORY_DEF * TeeFactory FACTORY_NAME StringFormatter_2 INPUT FEATURE_TYPE StringFormatter_OUTPUT OUTPUT FEATURE_TYPE StringFormatter_2_OUTPUT @Tcl2(StringFormatter_2_formatter)
# -------------------------------------------------------------------------
FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator INPUT FEATURE_TYPE StringFormatter_2_OUTPUT ATTR _sort 0 ATTR text_line_data Value_min_yValue_max_yValue_min_xValue_max_xValue_spacing_yValue_spacing_x OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_OUTPUT
# -------------------------------------------------------------------------
FACTORY_DEF * SortFactory FACTORY_NAME Sorter INPUT FEATURE_TYPE AttributeCreator_OUTPUT INPUT FEATURE_TYPE AttributeCreator_2_OUTPUT INPUT FEATURE_TYPE AttributeCreator_5_OUTPUT SORT_BY _sort NUMERIC ASCENDING OUTPUT SORTED FEATURE_TYPE Sorter_SORTED
# -------------------------------------------------------------------------
FACTORY_DEF * RoutingFactory FACTORY_NAME "Destination Feature Type Routing Correlator" COMMAND_PARM_EVALUATION SINGLE_PASS INPUT FEATURE_TYPE * ROUTE FME_GENERIC Sorter_SORTED TO TEXTLINE __GO_TO_FINAL_OUTPUT_ROUTER__ multi_writer_id,0,SupplyAttributesENCODED__wb_out_feat_type__text_line GEOMETRY FEATURE_TYPE_ATTRIBUTE __wb_out_feat_type__ OUTPUT ROUTED FEATURE_TYPE * OUTPUT NOT_ROUTED FEATURE_TYPE __nuke_me__ @Tcl2("FME_StatMessage 818059 [FME_GetAttribute fme_template_feature_type] 818060 818061 fme_warn")
# -------------------------------------------------------------------------
FACTORY_DEF * TeeFactory FACTORY_NAME "Final Output Nuker" INPUT FEATURE_TYPE __nuke_me__